package com.javaweb.db.mybatis.api;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.javaweb.constant.CommonConstant;
import com.javaweb.db.query.QueryWapper;

/**
 * 数据库层共通接口
 * <P>
 * 本类的所有方法原则上不应该被重写
 * @author tank2140896
 * @param <T> 实体类泛型
 */
@Mapper
public interface DaoWapper<T> {
	
	/**
	 * 插入
	 * @param t 实体类
	 * @return Integer 插入操作后的返回值
	 */
	@Insert(CommonConstant.EMPTY_VALUE)
	Integer insert(T t);
	
	/**
	 * 更新
	 * @param t 实体类
	 * @return Integer 更新操作后的返回值
	 */
	@Update(CommonConstant.EMPTY_VALUE)
	Integer update(T t);
	
	/**
	 * 根据主键删除
	 * @param id 主键ID
	 * @return Integer 删除操作后的返回值
	 */
	@Delete(CommonConstant.EMPTY_VALUE)
	Integer delete(Object id);
	
	/**
	 * 查询所有
	 * @return List<T> 实体类列表
	 */
	@Select(CommonConstant.EMPTY_VALUE)
	List<T> selectAll();
	
	/**
	 * 统计所有
	 * @return Long 数据条数
	 */
	@Select(CommonConstant.EMPTY_VALUE)
	Long selectAllCount();
	
	/**
	 * 根据主键查询
	 * @param id 主键ID
	 * @return T 实体类
	 */
	@Select(CommonConstant.EMPTY_VALUE)
	T selectByPk(Object id);
	
	/**
	 * 条件查询只取一条
	 * <p>
	 * 底层实现只是加了个限制，如limit 1，只取一条
	 * @see QueryWapper
	 * @param queryWapper 查询参数
	 * @return T 实体类
	 */
	@Select(CommonConstant.EMPTY_VALUE)
	T selectOne(QueryWapper<T> queryWapper);

	/**
	 * 条件查询（支持分页）
	 * @see QueryWapper
	 * @param queryWapper 查询参数
	 * @return List<T> 实体类列表
	 */
	@Select(CommonConstant.EMPTY_VALUE)
	List<T> selectList(QueryWapper<T> queryWapper);
	
	/**
	 * 条件查询统计（支持分页）
	 * @see QueryWapper
	 * @param queryWapper 查询参数
	 * @return Long 数据条数
	 */
	@Select(CommonConstant.EMPTY_VALUE)
	Long selectListCount(QueryWapper<T> queryWapper);

}
